﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;

namespace NineSeas.Extensions
{
    public static class StringExtensions
    {
        public static string RegexReplace(this string target, Regex regex, string replaceText)
        {
            return regex.Replace(target, replaceText);
        }

        public static string UppercaseFirst(this string target)
        {
            // Check for empty string.
            if (string.IsNullOrEmpty(target))
            {
                return string.Empty;
            }
            // Return char and concat substring.
            return char.ToUpper(target[0]) + target.Substring(1);
        }
        public static string ToUrlFriendly(this string target)
        {
            return UrlUtilities.UrlFriendlyString(target);
        }
    }
    public static class UrlUtilities
    {

        private static readonly string[] _cyrillic = new string[] { 
            "а", "б", "в", "г", "д", "е", "ж", "з", "и", "й", "к", "л", "м", "н", "о",
		    "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ь", "ю", "я",
		    "А", "Б", "В", "Г", "Д", "Е", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О",
		    "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ь", "Ю", "Я",
		    "Ї", "ї", "Є", "є", "Ы", "ы", "Ё", "ё",
		    "ı", "İ", "ğ", "Ğ", "ü", "Ü", "ş", "Ş", "ö", "Ö", "ç", "Ç",
		    "Á", "á", "Â", "â", "Ã", "ã", "À", "à", "Ç", "ç", "É", "é", "Ê", "ê", "Í",
		    "í", "Ó", "ó", "Ô", "ô", "Õ", "õ", "Ú", "ú"
        };

        private static readonly string[] _latin = new string[] { 
            "a", "b", "v", "g", "d", "e", "zh", "z", "i", "y", "k", "l", "m", "n", "o",
		    "p", "r", "s", "t", "u", "f", "h", "ts", "ch", "sh", "sht", "a", "y", "yu", "ya",
		    "A", "B", "B", "G", "D", "E", "Zh", "Z", "I", "Y", "K", "L", "M", "N", "O",
		    "P", "R", "S", "T", "U", "F", "H", "Ts", "Ch", "Sh", "Sht", "A", "Y", "Yu", "Ya",
		    "I", "i", "Ye", "ye", "I", "i", "Yo", "yo",
		    "i", "I", "g", "G", "u", "U", "s", "S", "o", "O", "c", "C",
		    "A", "a", "A", "a", "A", "a", "A", "a", "C", "c", "E", "e", "E", "e", "I",
		    "i", "O", "o", "O", "o", "O", "o", "U", "u"
        };

        private static readonly Regex aRegex = new Regex("à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ");
        private static readonly Regex eRegex = new Regex("è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ");
        private static readonly Regex oRegex = new Regex("ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ");
        private static readonly Regex uRegex = new Regex("ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ");
        private static readonly Regex iRegex = new Regex("ì|í|ị|ỉ|ĩ");
        private static readonly Regex yRegex = new Regex("ỳ|ý|ỵ|ỷ|ỹ");
        private static readonly Regex dRegex = new Regex("đ");
        private static readonly Regex specialRegex = new Regex(@"!|@|%|\^|\*|\(|\)|\+|=|\b(?=\w)|\b(?!\w)|\?|/|,|\.|:|;|'| |""|&|#|\[|\]|~|$|_");
        private static readonly Regex dashRegex = new Regex("-+-");
        private static readonly Regex dashOnlyRegex = new Regex("^-+|-+$");

        

        public static string UrlFriendlyString(string input)
        {
            if (String.IsNullOrWhiteSpace(input)) return String.Empty;

            return input.ToLowerInvariant()
                .Replace(' ', '-')
                .RegexReplace(aRegex, "a")
                .RegexReplace(eRegex, "e")
                .RegexReplace(oRegex, "o")
                .RegexReplace(uRegex, "u")
                .RegexReplace(iRegex, "i")
                .RegexReplace(yRegex, "y")
                .RegexReplace(dRegex, "d")
                .RegexReplace(specialRegex, "-")
                .RegexReplace(dashRegex, "-")
                .RegexReplace(dashOnlyRegex, "");

        }

    }
}